package com.hue.gulimail.gulimailorder;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * @author 姚凤桥
 * 引入Rabbit场景启动器之后会自动导入以下组件:
 * CachingConnectionFactory RabbitTemplate AmqpAdmin RabbitMessagingTemplate
 * 在配置文件中配置连接信息
 * 开启RabbitMq：@EnableRabbit
 * <p>
 * 接受RabbitMQ的消息：
 * 1.@RabbitListener: 标注在类或者方法上，指定要监听的队列
 * 2.@RabbitHandler: 标注在方法上，指定要监听的队列
 * 当一个队列的消息可能有多种类型时，可以在类上使用RabbitListener并且在方法上使用@RabbitHandler来指定接受不同类型的消息(方法重载)
 * <p>
 * 解决同一个类里面事务方法互调的坑：
 * 1.导入spring-boot-starter-aop依赖(引入了aspectj)
 * 2.使用@EnableAspectJAutoProxy(exposeProxy = true)开启AspectJ来生成动态代理对象(spring-boot默认使用jdk动态代理)
 * AspectJ与jdk动态代理的区别: AspectJ生成代理对象时不需要对象实现接口，jdk动态代理必要要对象实现某个接口
 * <p>
 * 整合Seata：
 * 1.每个微服务数据库都要创建一个undo_log表
 * 2.启动seata-server
 * 3.导入spring-cloud-starter-alibaba-seata依赖（版本必须和seata-server的版本相同）
 * 4.让每一个微服务使用seata的DataSourceProxy来来代理自己的数据源
 * 5.每个微服务都必须添加file.conf和registry.conf两个配置
 * 6.file.conf文件server下的vgroup_mapping.${微服务名}-fescar-service-group = "default"配置每个都不一样
 * 7.给分布式事务的事务入口方法标注@GloablTransaction注解，分支事务标注@Transaction注解
 */
@MapperScan("com.hue.gulimail.gulimailorder.dao")
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableRedisHttpSession
@EnableRabbit
@EnableAspectJAutoProxy(exposeProxy = true)
public class GulimailOrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimailOrderApplication.class, args);
    }

}
